1044. Longest Duplicate Substring - LeetCode Solution


Hash Binary Search

Python Code:

class Solution:
    def longestDupSubstring(self, S: str) -> str:
        power = 2**63 - 1
        def rabin(mid):
            chash = 0
            for i in range(mid):
                chash = (chash * 26 + nums[i]) % power
            hashes = {chash}
            position = -1
            max_pow = pow(26, mid, power)
            for i in range(mid, len(S)):
                chash = (26*chash-nums[i-mid]*max_pow + nums[i]) % power
                if chash in hashes:
                    position = i + 1 - mid
                hashes.add(chash)
            return position


        low, high = 0, len(S)-1
        end = 0
        start = 0
        nums = [ord(c)-ord('a') for c in S]
        while low <= high:
            mid = (low+high) // 2
            position = rabin(mid)
            if position == -1:  # no matching strings found
                high = mid - 1
            else:
                start = position
                low = mid + 1
        return S[start:start+low-1]


Comments

Submit
0 Comments
More Questions

946. Validate Stack Sequences
921. Minimum Add to Make Parentheses Valid
881. Boats to Save People
497. Random Point in Non-overlapping Rectangles
528. Random Pick with Weight
470. Implement Rand10() Using Rand7()
866. Prime Palindrome
1516A - Tit for Tat
622. Design Circular Queue
814. Binary Tree Pruning
791. Custom Sort String
787. Cheapest Flights Within K Stops
779. K-th Symbol in Grammar
701. Insert into a Binary Search Tree
429. N-ary Tree Level Order Traversal
739. Daily Temperatures
647. Palindromic Substrings
583. Delete Operation for Two Strings
518. Coin Change 2
516. Longest Palindromic Subsequence
468. Validate IP Address
450. Delete Node in a BST
445. Add Two Numbers II
442. Find All Duplicates in an Array
437. Path Sum III
436. Find Right Interval
435. Non-overlapping Intervals
406. Queue Reconstruction by Height
380. Insert Delete GetRandom O(1)
332. Reconstruct Itinerary